//https://www.nowcoder.com/practice/653d5a6041a04b8cb9b082eeb1429d1c?tpId=354&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Fcompany
//牛群的最大能量环
//农场里有一群牛，每头牛都有一个能量值，这些能量值组成一个环形整数数组 energy。现在农场主想知道，从这群牛中选择一个连续的子群，使得这个子群的能量值之和最大。请你编写一个程序，实现这个功能。
//环形数组意味着数组的末端将会与开头相连呈环状。形式上，energy[i] 的下一个元素是 energy[(i + 1) % n] ，energy[i] 的前一个元素是 energy[(i - 1 + n) % n]。
//子群中每个位置的元素最多只能出现一次。
int maxEnergyCircular(int* energy, int energyLen ) {
    // write code here
    //结果为线状最大，或者首尾相连最大
    //首尾相连最大，即sum减去线性最小
    int max = energy[0];
    int min = energy[0];
    int tmax = 0;//当前位置
    int tmin = 0;//当前位置
    int sum = energy[0];
    for(int i = 1; i < energyLen; i++)
    {
        tmax = tmax > 0 ? tmax + energy[i] : energy[i];
        if(tmax > max)
        max = tmax;
        tmin = tmin < 0 ? tmin + energy[i] : energy[i];
        if(tmin < min)
        min = tmin;

        sum += energy[i];
    }
    sum -= min;
    return max > sum ? max : sum;
}